using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel.DataAnnotations;
using System.Web;

namespace SGCC.Models
{
    public class ObraModel
    {
        public int Id { get; set; }

        [Display(Name = "Cliente*")]
        [Required(ErrorMessage = "Campo Obrigatório.")]
        public Int32 clienteId{ get; set; }

        [Display(Name = "Engenheiro*")]
        [Required(ErrorMessage = "Campo Obrigatório*")]
        public Int32 engenheiroId { get; set; }

        [Display(Name = "Arquiteto*")]
        [Required(ErrorMessage = "Campo Obrigatório*")]
        public Int32 arquitetoId { get; set; }

        [Display(Name = "Tipo de Construção*")]
        [Required(ErrorMessage = "Campo Obrigatório*")]
        public Int32 tipoConstrucaoId { get; set; }

        [Display(Name = "Logradouro*")]
        [Required(ErrorMessage = "Campo Obrigatório*")]
        [StringLength(250, ErrorMessage = "Campo deve ter no maximo 250 caracteres.")]
        public String logradouro { get; set; }

        [Display(Name = "Cidade* ")]
        [Required(ErrorMessage = " Campo obrigatório.")]
        public Int32 cidadeId { get; set; }

        [Display(Name = "Estado* ")]
        [Required(ErrorMessage = " Campo obrigatório.")]
        public Int32 estadoId { get; set; }

        public String cliente { get; set; }
        public String engenheiro { get; set; }
        public String arquiteto { get; set; }
        public String tipoConstrucao { get; set; }
        public String cidade { get; set; }
        public String estado { get; set; }

        public ObraModel() {}

        public ObraModel(Obra pObra)
        {
            Id = pObra.ObraId;
            clienteId = pObra.ClienteId;
            cliente = pObra.Cliente.Nome;
            engenheiroId = pObra.EngenheiroId;
            engenheiro = pObra.Engenheiro.Nome;
            arquitetoId = pObra.ArquitetoId;
            arquiteto = pObra.Arquiteto.Nome;
            tipoConstrucaoId = pObra.TipoConstrucaoId;
            tipoConstrucao = pObra.TipoConstrucao.Nome;
            logradouro = pObra.Logradouro;
            cidadeId = pObra.CidadeId;
            cidade = pObra.Cidade.Nome;
            estadoId = pObra.EstadoId;
            estado = pObra.Estado.Sigla;
        }
        
        public void AtualizaObra(){}

        public void AdicionarObra(ObraModel obra)
        {
            Obra o = new Obra();
            o.ClienteId = obra.clienteId;
            o.EngenheiroId = obra.engenheiroId;
            o.ArquitetoId = obra.arquitetoId;
            o.TipoConstrucaoId = obra.tipoConstrucaoId;
            o.Logradouro = obra.logradouro;
            o.CidadeId = obra.cidadeId;
            o.EstadoId = obra.estadoId;
            o.Ativo = "S";

            using (DBContext db = new DBContext())
            {
                db.Obra.Add(o);
                db.SaveChanges();
            }
        }

        public void ExcluirObra(){}

        public List<ObraConsulta> ListarObras()
        {
            using (DBContext db = new DBContext())
            {
                var obras = (from o in db.Obra
                             join c in db.Cliente on o.ClienteId equals c.ClienteId
                             join e in db.Engenheiro on o.EngenheiroId equals e.EngenheiroId
                             join a in db.Arquiteto on o.ArquitetoId equals a.ArquitetoId
                             join t in db.TipoConstrucao on o.TipoConstrucaoId equals t.TipoConstrucaoId
                             join ci in db.Cidade on o.ClienteId equals ci.CidadeId
                             join es in db.Estado on o.EstadoId equals es.EstadoId
                             where ( o.Ativo == "S" )
                             orderby o.ObraId descending
                             select new { o, c, e, a, t, ci, es }).ToList();

                List<ObraConsulta> ListaObras = new List<ObraConsulta>();

                for( int i = 0; i < obras.Count; i++ )
                {
                    ListaObras.Add( new ObraConsulta()
                    {
                        Id = obras[i].o.ObraId,
                        Cliente = obras[i].c.Nome,
                        Engenheiro = obras[i].e.Nome,
                        Arquiteto = obras[i].a.Nome,
                        TipoConstrucao = obras[i].t.Nome,
                        Cidade = obras[i].ci.Nome,
                        UF = obras[i].es.Sigla,
                        Logradouro = obras[i].o.Logradouro
                    });
                }

                return ListaObras;
            }

        }

        public List<ObraModel> BuscarObra(ObraModel obra)
        {
            using (DBContext db = new DBContext())
            {
                var obras = (from o in db.Obra
                             join c in db.Cliente on o.ClienteId equals c.ClienteId
                             join e in db.Engenheiro on o.EngenheiroId equals e.EngenheiroId
                             join a in db.Arquiteto on o.ArquitetoId equals a.ArquitetoId
                             join t in db.TipoConstrucao on o.TipoConstrucaoId equals t.TipoConstrucaoId
                             join ci in db.Cidade on o.CidadeId equals ci.CidadeId
                             join es in db.Estado on o.EstadoId equals es.EstadoId
                             where (o.Ativo == "S" )
                             && ( obra.clienteId != null && o.ClienteId.Equals(obra.clienteId) )
                             && ( obra.engenheiroId != null && o.EngenheiroId.Equals(obra.engenheiroId) )
                             && ( obra.arquitetoId != null && o.ArquitetoId.Equals(obra.arquitetoId) )
                             && ( obra.tipoConstrucaoId != null && o.TipoConstrucaoId.Equals(obra.tipoConstrucaoId) )
                             && ( obra.cidadeId != null && o.CidadeId.Equals(obra.cidadeId) )
                             && ( obra.estadoId != null && o.EstadoId.Equals(obra.estadoId) )
                             orderby o.ObraId descending
                             select new { o, c, e, a, t, ci, es }).ToList();

                List<ObraModel> ListaObras = new List<ObraModel>();

                for (int i = 0; i < obras.Count; i++)
                {
                    ListaObras.Add(new ObraModel()
                    {
                        Id = obras[i].o.ObraId,
                        cliente = obras[i].c.Nome,
                        engenheiro = obras[i].e.Nome,
                        arquiteto = obras[i].a.Nome,
                        tipoConstrucao = obras[i].t.Nome,
                        cidade = obras[i].ci.Nome,
                        estado = obras[i].es.Sigla
                    });
                }

                return ListaObras;
            }

        }
    
    }
}